wayland: Explicitly announce ssd for kwin
authorMatthias Clasen <mclasen@redhat.com>
Fri, 22 Jan 2021 03:43:33 +0000 (22:43 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 22 Jan 2021 03:45:47 +0000 (22:45 -0500)
Without this, kwin correctly assumes that we are
using client-side decorations. This is a port
of 32ae97f1 from GTK 3.24.

Fixes: #3609
gdk/wayland/gdksurface-wayland.c
gdk/wayland/gdksurface-wayland.h
gtk/gtkwindow.c

index c114c04f29756627c1f22750cd1be1f99032edcc..0fd1b82a9b51024eac0bcc31a9f4b5580b8aee1e 100644 (file)
@@ -2223,6 +2223,24 @@ gdk_wayland_toplevel_announce_csd (GdkToplevel *toplevel)
                                                 ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_CLIENT);
 }
 
+void
+gdk_wayland_toplevel_announce_ssd (GdkToplevel *toplevel)
+{
+  GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_surface_get_display (GDK_SURFACE (toplevel)));
+  GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (toplevel);
+
+  g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel));
+
+  if (!display_wayland->server_decoration_manager)
+    return;
+  impl->display_server.server_decoration =
+    org_kde_kwin_server_decoration_manager_create (display_wayland->server_decoration_manager,
+                                                  impl->display_server.wl_surface);
+  if (impl->display_server.server_decoration)
+    org_kde_kwin_server_decoration_request_mode (impl->display_server.server_decoration,
+                                                ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_SERVER);
+}
+
 gboolean
 gdk_wayland_toplevel_inhibit_idle (GdkToplevel *toplevel)
 {
index b0d0d6fc1960a83444382a956423011794a26bd5..8efa4be04dfbb9a351e89c5892e9557bf6497364 100644 (file)
@@ -33,6 +33,7 @@ void                     gdk_wayland_toplevel_set_dbus_properties       (GdkTopl
                                                                          const char  *unique_bus_name);
 
 void                     gdk_wayland_toplevel_announce_csd              (GdkToplevel *toplevel);
+void                     gdk_wayland_toplevel_announce_ssd              (GdkToplevel *toplevel);
 
 gboolean                 gdk_wayland_toplevel_inhibit_idle              (GdkToplevel *toplevel);
 void                     gdk_wayland_toplevel_uninhibit_idle            (GdkToplevel *toplevel);
index 06835dc99ccd7fc0f4b67869f381bc2b097ee125..91f6d4698983245e95f3394dddddfc2885de94c1 100644 (file)
@@ -4204,8 +4204,13 @@ gtk_window_realize (GtkWidget *widget)
   gdk_toplevel_set_deletable (GDK_TOPLEVEL (surface), priv->deletable);
 
 #ifdef GDK_WINDOWING_WAYLAND
-  if (priv->client_decorated && GDK_IS_WAYLAND_SURFACE (surface))
-    gdk_wayland_toplevel_announce_csd (GDK_TOPLEVEL (surface));
+  if (GDK_IS_WAYLAND_SURFACE (surface))
+    {
+      if (priv->client_decorated)
+        gdk_wayland_toplevel_announce_csd (GDK_TOPLEVEL (surface));
+      else
+        gdk_wayland_toplevel_announce_ssd (GDK_TOPLEVEL (surface));
+    }
 #endif
 
   gdk_toplevel_set_modal (GDK_TOPLEVEL (surface), priv->modal);